/**
 *  @ Desc 南瑞继保 103 tcp通信客户端界面实现类，提供参数设置 和 收发操作界面
 *
 * */

#ifndef NRJB103CLIENT
#define NRJB103CLIENT

#define TIME_GETDATA 5000       // 用户点击读取后获取定值信息有关的耗时

#include <QWidget>
#include "NRJB/NRJBConnection.h"
#include "NRJB/NRJB103_Parser.h"
#include "PanelBill.h"
#include "CommBase.h"

namespace Ui {
class PanelNRJB_TCPClient;
}

class NRJB103Client:public QWidget, public CommBase
{
    Q_OBJECT
public:
    explicit NRJB103Client(QWidget *parent = nullptr);
    ~NRJB103Client();

    // 对外接口
    void connectDevice(QString devAddr, QString devPort, QString localAddr, QString localPort) override;
    void readDeviceAll() override;
    void getAllBillInfo(QMap<QString, BillTableStruct> &tablesInfo) override;          //获取解析完的结果全部
    void disConnectDevice() override;
    void setBillGroup(QStringList& ) override;      // 对于南瑞继保次函数不需要
    QStringList getErrorLog() override;

    void showTable() override;

    bool m_connectedFlag;     // connection 连接成功状态，在下一步读取操作检查

signals:
    void sig_sendClicked();    //发送消息信号
    void sig_connect();
    //void sig_parseFinished(QStringList, int);    // parser层解析完后通知 table更新数据
    void sig_requestDeviceData();   //用户发通过外部的接口发送请求读取保护设备
    void sig_endReadAll();      // 在一键读取全部定值信息的一轮操作结束后发出，提示用户进行结果的获取 调用 getAllBillInfo;

    void sig_parserRecv(QByteArray );

private slots:
    void slot_send();   // 发送消息
    void slot_recv();   // 接收消息

    void slot_updateUiAsDisconnect();
    void slot_updateUiAsConnected();
    void slot_updateUiAsSend(QString sendMsg);

    void slot_pushButtonConnect_clicked();

    void on_pushButtonClear_clicked();

    // 选择对应命令发送给保护
    void on_pushButtonSendCombox_clicked();

    void on_radioButtonHeart_clicked(bool checked);

    // 展示定值模板
    void slot_pushButtonShowBill_clicked();

    // 选择读取指定组的信息
    void on_pushButtonReadGroup_clicked();

    void slot_setCanReadBillInfo();

    // 读取定值有关组的信息
    void slot_pushButtonReadAll_clicked();

    // 外部接口通过启动定时器启动
    void slot_responseForUserApi();

    void slot_getBillInfo();    // 获取结果的定时器槽函数

    void slot_ConnectError();

private:
    Ui::PanelNRJB_TCPClient *ui;
    NRJBConnection *m_connection;   // 通信套接字接口
    NRJB103Constructer m_nrjbPacketConstructer;
    NRJB103_Parser m_NRJBParser;
    PanelBill m_panelBill;    //显示装置定值信息模板

    //  通信参数配置
//    QString m_destDevAddr;  // 保护设备的ip地址
    QString m_ip;       // 保护设备的 ip地址
    QString m_port;        // 保护上的tcp监听服务端口
    // 在tcp 连接成功后进行初始化
    QString m_srcAddr;      //   103 源设备地址，也就是本机ip地址的后  

//    bool m_canGetBillInfo;   // true --已经获取到各组标题信息， false -- 待获取分组信息

    // 读取全部定值组的有关信息
    void readAllGroupsInfo();
    void readAllTitlesInfo();

    QByteArrayList m_recvList;
    QTimer m_timerConnectDev;

    QTimer m_timerReadDeviceRequest;    // 当接口使用的时候，避免单次调用readAll接口，但是连接未成功就读，启动定时器检查连接状态，ok就开始读
    bool  isCanComminucate;             // 是否可以开始于保护通讯

    QMap<QString, BillTableStruct> m_tablesInfo;       // 提供存储解析报文的接口

    QTimer m_timerGetParseResult;   // 延迟6s（预计需要耗时）， 单次触发， 在用户点击读取后启动， 超时就初始化m_tablesInfo

    QStringList m_errorList;    //存放自动通信过程中的全部错误信息

    QThread *m_parserThread;
};
#endif // NRJB_TCPCLIENT
